//每一个小仓库需要有四样:state|mutations|actions|getters
import {
  reqUserCartList,
  reqAddOrUpdateCart,
  reqUpdateChecked,
  reqDeleteGoodById,
} from "@/api";
const state = {
  //存储用户自身购物车数据
  cart: [],
};

const mutations = {
  GETUSERCARTLIST(state, cart) {
    state.cart = cart;
  },
};
const actions = {
  // 获取购物车数据
  async getUserCartList({ commit, state, dispatch, getters }) {
    //当组件挂载完毕:mounted先发一次请求，获取用户购物车的数据
    let result = await reqUserCartList();
    if (result.code == 200) {
      //result.data:返回的是一个数组，数组里面有一个对象.xxxx才是购物车的数据
      commit("GETUSERCARTLIST", result.data);
    }
  },

  //修改某一个商品数量
  async updateGoodSkuNum(
    { commit, state, dispatch, getters },
    { skuId, skuNum }
  ) {
    //发请求通知服务器哥哥:修改数据库里面商品数量
    let result = await reqAddOrUpdateCart(skuId, skuNum);
    //组件需要知道这次修改商品数量成功|失败
    if (result.code == 200) {
      return "ok";
    } else {
      return Promise.reject(new Error(result.message));
    }
  },

  //修改某一个商品的勾选状态
  async updateGoodChecked(
    { commit, state, dispatch, getters },
    { skuId, isChecked }
  ) {
    let result = await reqUpdateChecked(skuId, isChecked);
    //判断商品修改状态成功、失败
    //组件可以判断修改成功、失败干什么
    if (result.code == 200) {
      return "ok";
    } else {
      return Promise.reject(new Error(result.message));
    }
  },
  //删除某一个商品
  async removeGoodById({ commit, state, dispatch, getters }, skuId) {
    let result = await reqDeleteGoodById(skuId);
    //删除商品成功、失败返回
    if (result.code == 200) {
      return "ok";
    } else {
      return Promise.reject(new Error(result.message));
    }
  },

  //删除用户选中的全部商品
  removeAllCheckedGood({ commit, state, dispatch, getters }) {
    //Promise.all函数执行:需要传递数组，数组里面需要promise对象,
    //数组里面Promise对象都是成功,Promise.all执行返回是成功的Promise对象
    //数组里面Promise对象只要有一个失败，Promise.all执行返回是失败的Promise对象
    //Promise.all([ps,ps1,ps2,ps3,ps4])
    //state|getters获取仓库里面数据
    //还是可以一个一个删除用户选中商品
    //保证全部商品(选中)删除成功以后，组件再次获取最新购物车数据
    let arr = [];
    getters.cartInfoList.forEach(async (good) => {
      //只有选中的商品才会发请求，删除商品
      if (good.isChecked == 1) {
        let ps = dispatch("removeGoodById", good.skuId);
        //添加到数组里面
        arr.push(ps);
      }
    });
    //底下这样语句返回的是一个Promise对象，成功、失败
    //取决于数组里面ps对象:如果都是成功，返回成功promise对象
    //只要有一个失败，返回即为失败Promise对象
    return Promise.all(arr);
  },

  //全选的操作
  updateAllGoodChecked({ commit, state, dispatch, getters }, isChecked) {
    let arr = [];
    //获取购物车全部的商品
    getters.cartInfoList.forEach((good) => {
      let ps = dispatch("updateGoodChecked", { skuId: good.skuId, isChecked });
      arr.push(ps);
    });
    return Promise.all(arr);
  },
};


const getters = {
  //简化购物车数据
  cartInfoList() {
    return (state.cart[0] || {}).cartInfoList || [];
  },
};
//对外暴露小仓库
export default {
  state,
  mutations,
  actions,
  getters,
};
